home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / DC_VIEW / DCMAIN.C < prev    next >
Text File  |  1995-03-20  |  31KB  |  945 lines

  1. /******************************************************************************
  2.  *    DCmain.c:    DC_View for SX-Window    1995.02.13    f.ogasawara
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <zmusic.h>
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <stat.h>
  13. #include <io.h>
  14. #include <jfctype.h>
  15. #include <doslib.h>
  16. #include <event.h>        /* イベントマンを利用するときに必要    */
  17. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  18. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  19. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  20. #include <control.h>        /* コントロールマンを利用するときに必要    */
  21. #include <task.h>        /* タスクマンを利用するときに必要    */
  22. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  23.  
  24. char _sxkernelcomm[] = SXKERNEL;    /* カーネル起動コマンド        */
  25. static int mojiFlag;
  26. static char moji[256];
  27.  
  28. /******************************************************************************
  29.  *    main():        メイン関数
  30.  ******************************************************************************
  31.  */
  32. int main(void)
  33. {
  34.     ComVal cv;            /* 共通変数            */
  35.  
  36.     if (!init(&cv)) {        /* 初期化処理を行う        */
  37.         showErrDialog(&cv);    /* エラーダイアログを表示する    */
  38.         cv.endFlag = TRUE;    /* 終了フラグをセットする    */
  39.     }
  40.     /* 終了フラグがセットされるまでループする */
  41.     while (!cv.endFlag) {
  42.         cv.errorCode = 0;    /* エラーコードをクリアする    */
  43.         /* タスクマンからイベントを取得する */
  44.         TSEventAvail(cv.eventMask, &cv.event);
  45.         /* 各イベントに対応した処理を行う */
  46.         switch (cv.event.ts.what) {
  47.         case E_MSLDOWN:        /* マウスレフトダウンイベント    */
  48.             msLDownEvent(&cv);
  49.             break;
  50.         case E_MSRDOWN:        /* マウスライトダウンイベント    */
  51.             msRDownEvent(&cv);
  52.             break;
  53.         case E_IDLE:        /* アイドルイベント        */
  54.             IdleEvent(&cv);
  55.             break;
  56.         case E_KEYDOWN:        /* キーダウンイベント        */
  57.             keyDownEvent(&cv);
  58.             break;
  59.         case E_UPDATE:        /* アップデートイベント        */
  60.             updateEvent(&cv);
  61.             break;
  62.         case E_ACTIVATE:    /* アクティベートイベント    */
  63.             activateEvent(&cv);
  64.             break;
  65.         case E_SYSTEM1:        /* システムイベント        */
  66.         case E_SYSTEM2:
  67.             systemEvent(&cv);
  68.             break;
  69.         }
  70.         if (cv.errorCode != 0)    /* エラーが発生したか?        */
  71.             showErrDialog(&cv); /* エラーダイアログを表示する */
  72.     }
  73.     /* 終了手続きを行う */
  74.     endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
  75.  
  76.     return 0;
  77. }
  78.  
  79. /******************************************************************************
  80.  *    init():        初期化処理
  81.  ******************************************************************************
  82.  *    引数:    ComVal *pcv    共通変数へのポインタ
  83.  *    戻り値:    BOOLEAN        = TRUE:  初期化成功
  84.  *                = FALSE: 初期化失敗(終了)
  85.  *    注釈:    共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
  86.  *        表示などを行う。
  87.  */
  88. BOOLEAN init(ComVal *pcv)
  89. {
  90.     int i;
  91.     Rect rc =  { 18, 0, WIN_H, WIN_V - 20 };
  92.     Rect txtrc =  { 0, 0, WIN_H, WIN_V - 20 };
  93.  
  94.     pcv->windowPtr = NULL;        /* ウィンドウポインタ        */
  95.     pcv->activeFlag = FALSE;    /* アクティブフラグ        */
  96.     pcv->eventMask = EVENTMASK;    /* イベントマスク        */
  97.     pcv->errorCode = 0;        /* エラーコード            */
  98.     pcv->endFlag = FALSE;        /* 終了フラグ            */
  99.     pcv->hResMap = NULL;        /* リソースマップのハンドル    */
  100.     pcv->menuHdl = NULL;        /* メニューハンドル        */
  101.  
  102.     pcv->updateRgnHdl = NULL;    /* テキスト表示        */
  103.     pcv->txtRgnHdl = NULL;
  104.     pcv->winRgnHdl = NULL;
  105.     pcv->txt = NULL;
  106.     pcv->txtNo = NULL;
  107.     pcv->ofset = 0;
  108.     pcv->scrollFlag = 0;
  109.     pcv->scrollDir = 0;
  110.  
  111.     pcv->pastFno = 0;
  112.     pcv->view = rc;            /* view rectangle    */
  113.  
  114.     pcv->pre_esc = 0;        /* テキスト処理        */
  115.     pcv->loadFlag = 0;
  116.     pcv->mloadFlag = 0;
  117.     pcv->currentPath[0] = 0;
  118.     strcpy(pcv->a_drv, "A:");
  119.     strcpy(pcv->b_drv, "B:");
  120.  
  121.     pcv->cutNo = 1;            /* cutfile load        */
  122.     pcv->txtRgnHdl = GMNewRgn();
  123.     pcv->winRgnHdl = GMNewRgn();
  124.  
  125.     for(i=0;i<<20;i++) {
  126.         pcv->bitsH[i] = NULL;
  127.         pcv->offgraphOK[i] = 0;
  128.     }
  129.  
  130.     pcv->mojiFlag = 0;        /* 文字列検索        */
  131.     pcv->status = 0;
  132.  
  133.     strcpy(pcv->title, "DC_VIEW");    /* タイトル        */
  134.  
  135.     TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する    */
  136.  
  137.     if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
  138.         pcv->errorCode = 1;    /* バージョン2より古い        */
  139.         return FALSE;        /* 失敗したのでFALSEを返す    */
  140.     }
  141.  
  142.     if (!openResource(pcv))     {    /* リソースファイルを読み込む    */
  143.         /* オープンできなかった    */
  144.         pcv->errorCode = 2;    /* 作成できなかった        */
  145.         return FALSE;        /* 失敗したのでFALSEを返す    */
  146.     }
  147.     pcv->menuHdl = TSReferMN(128);    /* メニューハンドルの取得       */
  148.     (_Handle *) pcv->pcmHdl = TSRscGet('pram', 128); /* 環境読み込み*/
  149.     (_Handle *) pcv->mzHdl  = TSRscGet('pram', 129);
  150.     (_Handle *) pcv->picHdl = TSRscGet('pram', 130);
  151.     (_Handle *) pcv->envHdl = TSRscGet('pram', 131);
  152.  
  153.     if (pcv->pcmHdl == NULL || pcv->mzHdl == NULL
  154.         || pcv->picHdl == NULL || pcv->envHdl == NULL) {
  155.         pcv->errorCode = 2;    /* 作成できなかった        */
  156.         return FALSE;        /* 失敗したのでFALSEを返す    */
  157.     }
  158.  
  159.     pcv->mzTask  = (int)(**pcv->mzHdl);    /* 起動プログラム    */
  160.     pcv->pcmTask = (int)(**pcv->pcmHdl);
  161.     pcv->picTask = (int)(**pcv->picHdl);
  162.  
  163.     pcv->scrollstep = (int)(**pcv->envHdl);
  164.     pcv->cutDisp    = (int)(*((*pcv->envHdl) + 1));
  165.     pcv->lineDisp    = (int)(*((*pcv->envHdl) + 2));
  166.  
  167.     strcpy(pcv->mzFname,     (*pcv->mzHdl)  +  1);
  168.     strcpy(pcv->mzOpt,     (*pcv->mzHdl)  + 91);
  169.     strcpy(pcv->pcmFname,     (*pcv->pcmHdl) +  1);
  170.     strcpy(pcv->pcmOpt,     (*pcv->pcmHdl) + 91);
  171.     strcpy(pcv->picFname,     (*pcv->picHdl) +  1);
  172.     strcpy(pcv->picOpt,     (*pcv->picHdl) + 91);
  173.  
  174.     if (!createWindow(pcv)) {    /* ウィンドウを作成する        */
  175.         pcv->errorCode = 2;    /* 作成できなかった        */
  176.         return FALSE;        /* 失敗したのでFALSEを返す    */
  177.     }
  178.  
  179.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  180.     GMAPage(G_PAGE0 | G_PAGE1 | G_PAGE2);
  181.     GMBackColor(G_BLACK);
  182.     GMForeColor(G_WHITE);
  183.     GMFontKind(G_ROM12);
  184.     GMFontMode(G_PSET);
  185.     GMPenMode(G_FORE | G_PSET);
  186.     GMFontFace(G_PLANE);
  187.  
  188.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  189.     GMAndRectRgn(pcv->txtRgnHdl, pcv->windowPtr->graph.clipping, &txtrc);
  190.     GMCopyRgn(pcv->winRgnHdl, pcv->windowPtr->graph.clipping);
  191.     return TRUE;            /* 成功したのでTRUEを返す    */
  192. }
  193.  
  194. /******************************************************************************
  195.  *    openResource():    リソースファイルのオープン
  196.  ******************************************************************************
  197.  *    引数:    ComVal *pcv    共通変数へのポインタ
  198.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  199.  *                = FALSE: 読み込み失敗(終了)
  200.  */
  201. BOOLEAN openResource(ComVal *pcv)
  202. {
  203.     int errCode;            /* エラーコード            */
  204.     Task tsbuf;            /* タスク管理レコード        */
  205.     char drv[2], path[65], node[19], ext[5];
  206.     char name[23], fileName[TS_NAMEMAX];
  207.     char szFile[TS_NAMEMAX];    /* フルパスでファイル名が戻るバッファ */
  208.  
  209.     /* リソースファイルのオープン&読み込み */
  210.     EMEnCross();
  211.     /* タスク名を取得する */
  212.     TSGetTdb(&tsbuf, TS_OWN);
  213.     /* タスク名を分解 */
  214.     strsfn(tsbuf.name, drv, path, node, ext);
  215.     /* 検索パスを作成 */
  216.     strmfn(szFile, drv, path, "", "");
  217.     /* リソースファイルを検索 */
  218.     errCode = TSSearchFile("DC_VIEW.LB", szFile, szFile);
  219.     strcpy(pcv->lbFname, szFile);
  220.     if (errCode < 0) {
  221.         EMDeCross();
  222.         /* 待ち状態を示すマウスポインタを元に戻す */
  223.         DMError(D_CONFIRM, "リソースファイル「DC_VIEW.LB」が\r"
  224.                    "見付かりません。");
  225.         return FALSE;
  226.     }
  227.     /* リソースのオープン,リソースマップの獲得 */
  228.     pcv->hResMap = TSResOpen(szFile);
  229.     if (pcv->hResMap == NULL) {
  230.         /* 待ち状態を示すマウスポインタを元に戻す */
  231.         EMDeCross();
  232.         DMError(D_CONFIRM, "リソースファイル「DC_VIEW.LB」が\r"
  233.                    "オープンできません。");
  234.         return FALSE;
  235.     }
  236.     /* すべてのリソースを読み込む(ファイルはクローズされる)*/
  237.     errCode = TSResLoad();
  238.     if (errCode < 0) {
  239.         /* 待ち状態を示すマウスポインタを元に戻す */
  240.         EMDeCross();
  241.         DMError(D_CONFIRM, "リソースファイルの読み込みに\r"
  242.                    "失敗しました。");
  243.         return FALSE;
  244.     }
  245.     EMDeCross();
  246. }
  247.  
  248. /******************************************************************************
  249.  *    createWindow():    ウィンドウの作成
  250.  ******************************************************************************
  251.  *    引数:    ComVal *pcv    共通変数へのポインタ
  252.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  253.  *                = FALSE: 作成失敗(終了)
  254.  */
  255. BOOLEAN createWindow(ComVal *pcv)
  256. {
  257.     int paramFlags;            /* パラメータの有無        */
  258.     Rect rc,rc2;
  259.     Task task;            /* タスク管理レコード        */
  260.     int ret,do_load = 0;
  261.     char name[256];
  262.  
  263.     static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
  264.  
  265.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  266.     paramFlags = TSTakeParam(    /* コマンドラインを解析する    */
  267.         task.command,        /* コマンドライン        */
  268.         &rc,            /* 指定されたウィンドウ位置    */
  269.         name,            /* 最終文字列を格納する        */
  270.         0,            /* アドレステーブルを保存しない    */
  271.         NULL,            /* アドレステーブルを作成しない    */
  272.         NULL);            /* ポインタを確保しない        */
  273.     if (!(paramFlags & 1)) {    /* ウィンドウ位置の指定があるか? */
  274.         /* ない場合、システムからウィンドウの左上座標を取得する */
  275.         rc = winSize;
  276.         GMSlideRect(&rc, TSGetWindowPos());
  277.     } else {
  278.         rc2 = rc;
  279.         rc = winSize;
  280.         rc.d.top = rc.d.top + rc2.d.top;
  281.         rc.d.right = rc.d.right + rc2.d.left ;
  282.         rc.d.bottom = rc.d.bottom + rc2.d.top;
  283.         rc.d.left = rc.d.left + rc2.d.left ;
  284.     }
  285.     pcv->windowPtr = WMOpen(    /* ウィンドウをオープンする    */
  286.         NULL,            /* ウィンドウポインタを確保する    */
  287.         &rc,            /* ウィンドウの表示位置        */
  288.         WINTITLE,        /* ウィンドウタイトル        */
  289.         FALSE,            /* オープン時に描画しない    */
  290.         WI_STD2 << 4,        /* タイトルの広い標準ウィンドウ    */
  291.         W_FRONT,        /* 一番手前に表示する        */
  292.         TRUE,            /* クローズボタンを使用する    */
  293.         TSGetID());        /* 自分のタスクID        */
  294.     if (pcv->windowPtr == NULL)
  295.         return FALSE;        /* 失敗したのでFALSEを返す    */
  296.  
  297.     structControl(pcv);        /* コントロールの作成        */
  298.  
  299.     if ((paramFlags & 2)==2) {    /* 文字列の指定があるか? */
  300.         GetData(pcv, name);
  301.     }
  302.  
  303.     return TRUE;            /* 成功したのでTRUEを返す    */
  304. }
  305.  
  306. /******************************************************************************
  307.  *    structControl():    コントロールの作成
  308.  ******************************************************************************
  309.  *    引数:    ComVal *pcv    共通変数へのポインタ
  310.  *    注釈:
  311.  */
  312. void structControl(ComVal *pcv)
  313. {
  314.     pcv->btn1Hdl=TSReferCM(128,pcv->windowPtr);
  315.     pcv->btn2Hdl=TSReferCM(129,pcv->windowPtr);
  316.     pcv->btn3Hdl=TSReferCM(130,pcv->windowPtr);
  317.     pcv->btn4Hdl=TSReferCM(131,pcv->windowPtr);
  318.     pcv->btn5Hdl=TSReferCM(132,pcv->windowPtr);
  319.     pcv->btn6Hdl=TSReferCM(133,pcv->windowPtr);
  320.     pcv->btn7Hdl=TSReferCM(134,pcv->windowPtr);
  321.     pcv->btn8Hdl=TSReferCM(135,pcv->windowPtr);
  322.     pcv->btn9Hdl=TSReferCM(136,pcv->windowPtr);
  323.     pcv->btn92Hdl=TSReferCM(142,pcv->windowPtr);
  324.     pcv->btn93Hdl=TSReferCM(143,pcv->windowPtr);
  325.     pcv->btn10Hdl=TSReferCM(137,pcv->windowPtr);
  326.     pcv->btn11Hdl=TSReferCM(138,pcv->windowPtr);
  327.     pcv->btn12Hdl=TSReferCM(139,pcv->windowPtr);
  328.  
  329.     pcv->volHdl=TSReferCM(140,pcv->windowPtr);
  330. }
  331.  
  332. /******************************************************************************
  333.  *    msLDownEvent():    マウスレフトダウンイベント処理
  334.  ******************************************************************************
  335.  *    引数:    ComVal *pcv    共通変数へのポインタ
  336.  *    注釈:
  337.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  338.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  339.  */
  340. void msLDownEvent(ComVal *pcv)
  341. {
  342.     int partCode;            /* ウィンドウのパートコード    */
  343.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  344.     Rect comRc = { 0, 0, 18, WIN_V - 20 };     /* コマンド領域     */
  345.     Rect btnRc = { 0, 361, WIN_H, WIN_V };     /* ボタン領域         */
  346.  
  347.     /* イベントが自分のウィンドウか? */
  348.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  349.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  350.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  351.             /* ウィンドウをアクティブにする */
  352.             WMSelect(pcv->windowPtr);
  353.             /* ボタンが押された場所のパートコードを取得する */
  354.             partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
  355.             /* タイトルバー以外か、左ボタンが離されたか? */
  356.             if (partCode != W_INDRAG || !EMLStill()) {
  357.                 return;
  358.             }
  359.         }
  360.         /* マウスのボタンが押されている間、ウィンドウの各種処理をシス
  361.            テムに任せて、ボタンが離された場所のパートコードを取得する */
  362.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  363.         if (partCode == W_INCLOSE)    /* クローズボタンか?        */
  364.             pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  365.         if (partCode == W_ININSIDE) {    /* ウィンドウの内側        */
  366.             if (GMPtInRect(&pcv->view, EMMSLoc())) {
  367.                 if (EMRBttn()) {    /* 左右ボタンともに押されている    */
  368.                     retpastf(pcv);
  369.                     return;
  370.                 }
  371.                 pcv->scrollFlag = scrollTxt(pcv, 1);
  372.             }
  373.             if (GMPtInRect(&comRc, EMMSLoc())) { /* 'TYPE='解読    */
  374.                 nextfile(pcv);
  375.             }
  376.             if (GMPtInRect(&btnRc, EMMSLoc())) { /* control check    */
  377.                 checkControl(pcv);
  378.             }
  379.         }
  380.  
  381.     }
  382. }
  383.  
  384. /******************************************************************************
  385.  *    checkControl():    コントロールのチェック
  386.  ******************************************************************************
  387.  *    引数:    ComVal *pcv    共通変数へのポインタ
  388.  */
  389. void checkControl(ComVal *pcv)
  390. {
  391.     int partCode;            /* コントロールのパートコード    */
  392.     int val;            /* コントロールの値        */
  393.     Control **ctrlHdl;        /* コントロールハンドル        */
  394.     char str[16], execfname[90], command[90];
  395.     int sclbuff;
  396.     char *txtPt;
  397.     int *txtNo;
  398.     int i,rtn;
  399.  
  400.     /* マウスのボタンが押されている間、コントロールの各種処理をシステムに
  401.        任せて、コントロールハンドルとボタンが離された場所のパートコードを
  402.        取得する */
  403.     partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, 0, &ctrlHdl);
  404.  
  405.     if (pcv->loadFlag == 0)            /* テキストが未表示なら戻る    */
  406.         return;
  407.  
  408.     switch (partCode) {
  409.     case C_INBTTN:                /* 文字ボタン    */
  410.         /* ボタン1か(行頭処理)? */
  411.         if (ctrlHdl == pcv->btn1Hdl && pcv->ofset != 0) {
  412.             pcv->ofset = 0;
  413.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  414.             break;
  415.         }
  416.         /* ボタン2か(行末処理)? */
  417.         if (ctrlHdl == pcv->btn2Hdl) {
  418.             pcv->ofset = pcv->Maxline - 29;
  419.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  420.             break;
  421.         }
  422.         /* ボタン3か(前項処理)? */
  423.         if (ctrlHdl == pcv->btn3Hdl && pcv->ofset > 0) {
  424.             pcv->ofset = pcv->ofset - 29;
  425.             if (pcv->ofset < 0)
  426.                 pcv->ofset =0;
  427.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  428.             break;
  429.         }
  430.         /* ボタン4か(次項処理)? */
  431.         if (ctrlHdl == pcv->btn4Hdl && pcv->ofset < pcv->Maxline - 29) {
  432.             pcv->ofset = pcv->ofset + 29;
  433.             if (pcv->ofset + 29 > pcv->Maxline)
  434.                 pcv->ofset = pcv->Maxline - 29;
  435.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  436.             break;
  437.         }
  438.         /* ボタン5か(改区前処理)? */
  439.         if (ctrlHdl == pcv->btn5Hdl) {
  440.             MMHdlLock(pcv->txt);
  441.             MMHdlLock(pcv->txtNo);
  442.             txtPt = *(pcv->txt);
  443.             txtNo = *(pcv->txtNo);
  444.             for (i=pcv->ofset - 1;i>0;i--) {
  445.                 if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
  446.                     break;
  447.             }
  448.             MMHdlUnlock(pcv->txtNo);
  449.             MMHdlUnlock(pcv->txt);
  450.             if (i<0)
  451.                 break;
  452.             pcv->ofset = i;
  453.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  454.             break;
  455.         }
  456.         /* ボタン6か(改区後処理)? */
  457.         if (ctrlHdl == pcv->btn6Hdl) {
  458.             MMHdlLock(pcv->txt);
  459.             MMHdlLock(pcv->txtNo);
  460.             txtPt = *(pcv->txt);
  461.             txtNo = *(pcv->txtNo);
  462.             for (i=pcv->ofset + 1;i<pcv->Maxline;i++) {
  463.                 if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
  464.                     break;
  465.             }
  466.             MMHdlUnlock(pcv->txtNo);
  467.             MMHdlUnlock(pcv->txt);
  468.             if (i>pcv->Maxline)
  469.                 break;
  470.             if (i>pcv->Maxline - 29)
  471.                 i = pcv->Maxline - 29;
  472.             pcv->ofset = i;
  473.             drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  474.             break;
  475.         }
  476.         /* ボタン7か(前行処理)? */
  477.         if (ctrlHdl == pcv->btn7Hdl && pcv->ofset > 0) {
  478.             sclbuff = pcv->scrollstep;
  479.             pcv->scrollstep = 1;
  480.             scrollTxt(pcv, -1);
  481.             pcv->scrollstep = sclbuff;
  482.             break;
  483.         }
  484.         /* ボタン8か(次行処理)? */
  485.         if (ctrlHdl == pcv->btn8Hdl && pcv->ofset < pcv->Maxline - 29) {
  486.             sclbuff = pcv->scrollstep;
  487.             pcv->scrollstep = 1;
  488.             scrollTxt(pcv, 1);
  489.             pcv->scrollstep = sclbuff;
  490.             break;
  491.         }
  492.         /* ボタン9か(検索処理)? */
  493.         if (ctrlHdl == pcv->btn9Hdl) {
  494.             if ((rtn = dialogProc5(pcv, 0)) >= 0) {
  495.                 pcv->ofset = pcv->ofset - 15;
  496.  
  497.                 if (pcv->status + 29 > pcv->Maxline)
  498.                     pcv->ofset = pcv->Maxline - 29;
  499.                 else if (pcv->status < 15)
  500.                     pcv->ofset = 0;
  501.  
  502.                 rtn = (rtn - pcv->ofset) * 12 + 12;
  503.                 drawGraph(pcv ,0);
  504.                 i = GMForeColor(G_RED);
  505.                 GMMove(LONGWORD(  6, rtn));
  506.                 GMLine(LONGWORD(582, rtn));
  507.                 GMForeColor(i);
  508.  
  509.                 CMShine(pcv->btn92Hdl,C_ACTIVE);
  510.                 CMShine(pcv->btn93Hdl,C_ACTIVE);
  511.  
  512.         }
  513.             break;
  514.         }
  515.         /* ボタン92か(全域検索処理)? */
  516.         if (ctrlHdl == pcv->btn92Hdl) {
  517.             if ((rtn = dialogProc5(pcv, 1)) >= 0) {
  518.                 pcv->ofset = pcv->ofset - 15;
  519.  
  520.                 if (pcv->status + 29 > pcv->Maxline)
  521.                     pcv->ofset = pcv->Maxline - 29;
  522.                 else if (pcv->status < 15)
  523.                     pcv->ofset = 0;
  524.  
  525.                 rtn = (rtn - pcv->ofset) * 12 + 12;
  526.                 drawGraph(pcv ,0);
  527.                 i = GMForeColor(G_RED);
  528.                 GMMove(LONGWORD(  6, rtn));
  529.                 GMLine(LONGWORD(582, rtn));
  530.                 GMForeColor(i);
  531.         }
  532.             break;
  533.         }
  534.         /* ボタン93か(次検索処理)? */
  535.         if (ctrlHdl == pcv->btn93Hdl) {
  536.             if ((rtn = dialogProc5(pcv, 2)) >= 0) {
  537.                 pcv->ofset = pcv->ofset - 15;
  538.  
  539.                 if (pcv->status + 29 > pcv->Maxline)
  540.                     pcv->ofset = pcv->Maxline - 29;
  541.                 else if (pcv->status < 15)
  542.                     pcv->ofset = 0;
  543.  
  544.                 rtn = (rtn - pcv->ofset) * 12 + 12;
  545.                 drawGraph(pcv ,0);
  546.                 i = GMForeColor(G_RED);
  547.                 GMMove(LONGWORD(  6, rtn));
  548.                 GMLine(LONGWORD(582, rtn));
  549.                 GMForeColor(i);
  550.         }
  551.             break;
  552.         }
  553.         /* ボタン10か(演奏再開処理)? */
  554.         if (ctrlHdl == pcv->btn10Hdl && pcv->mloadFlag) {
  555.             if (pcv->mzTask != 0) {
  556.                 sprintf(command, " %s", pcv->mzOpt);
  557.                 pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
  558.                 sprintf(command, " %s", pcv->zmsfname);
  559.                 pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
  560.             } else {
  561.                 exec_zms("(P)");
  562.             }
  563.             break;
  564.         }
  565.         /* ボタン11か(演奏停止処理)? */
  566.         if (ctrlHdl == pcv->btn11Hdl && pcv->mloadFlag) {
  567.             exec_zms("(S)");
  568.             break;
  569.         }
  570.  
  571.         /* ボタン12か(復帰処理)? */
  572.         if (ctrlHdl == pcv->btn12Hdl) {
  573.             retpastf(pcv);
  574.             break;
  575.         }
  576.     case C_INTHUMB:            /* スライドボリューム        */
  577.         if (ctrlHdl == pcv->volHdl) {
  578.                 pcv->ofset = CMValueGet(pcv->volHdl);
  579.                 drawGraph(pcv ,0);    /* テキスト全体を書き替え */
  580.         }
  581.         break;
  582.     }
  583. }
  584.  
  585. /******************************************************************************
  586.  *    msRDownEvent():    マウスライトダウンイベント処理
  587.  ******************************************************************************
  588.  *    引数:    ComVal *pcv    共通変数へのポインタ
  589.  *    注釈:
  590.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  591.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  592.  */
  593. void msRDownEvent(ComVal *pcv)
  594. {
  595.     int partCode,mpos;            /* ウィンドウのパートコード    */
  596.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  597.  
  598.     /* イベントが自分のウィンドウか? */
  599.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  600.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  601.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  602.             return;
  603.         }
  604.         /* マウスのボタンが押されている間、ウィンドウの各種処理をシス
  605.            テムに任せて、ボタンが離された場所のパートコードを取得する */
  606.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  607.         if (partCode == W_INDRAG) {    /* ドラッグリージョン        */
  608.             selectMenu(pcv);    /* メニューの作成と選択処理を行う */
  609.             return;
  610.         }
  611.         if (partCode == W_ININSIDE) {    /* ウィンドウの内側        */
  612.             if (EMLBttn()) {    /* 左右ボタンともに押されている    */
  613.                 retpastf(pcv);
  614.                 return;
  615.             }
  616.             if (GMPtInRect(&pcv->view, EMMSLoc()))    /* 逆scroll    */
  617.                 pcv->scrollFlag = scrollTxt(pcv, -1);
  618.         }
  619.     }
  620. }
  621.  
  622. /******************************************************************************
  623.  *    selectMenu():    ポップアップメニューの作成と選択処理
  624.  ******************************************************************************
  625.  *    引数:    ComVal *pcv    共通変数へのポインタ
  626.  */
  627. void selectMenu(ComVal *pcv)
  628. {
  629.     int num;
  630.  
  631.     num = MNSelect(                /* メニューの表示と選択を行う    */
  632.         pcv->menuHdl,            /* メニューハン    ドル        */
  633.         pcv->event.ev.where.x_y);    /* マウスの右ボタンが押された位置 */
  634.     switch (num) {
  635.     case 1:                    /* about me...            */
  636.         dialogProc1(pcv);
  637.         break;
  638.     case 2:
  639.         break;
  640.     case 3:                    /* ドライブパス設定        */
  641.         dialogProc2(pcv);
  642.         break;
  643.     case 4:                    /* 表示諸設定            */
  644.         dialogProc3(pcv);
  645.         break;
  646.     case 5:                    /* 起動プログラム設定        */
  647.         dialogProc4(pcv);
  648.         break;
  649.     case 6:
  650.         break;
  651.     case 7:
  652.         pcv->endFlag = TRUE;        /* 終了フラグをセットする    */
  653.         break;
  654.     }
  655. }
  656.  
  657. /******************************************************************************
  658.  *    dialogProc1():    ダイアログの作成、表示 (about me)
  659.  ******************************************************************************
  660.  *    引数:    ComVal *pcv    共通変数へのポインタ
  661.  */
  662. void dialogProc1(ComVal *pcv)
  663. {
  664.     Dialog *dialogPtr;
  665.     Graph *lastGraph;
  666.  
  667.     dialogPtr = TSReferDM(128,NULL,W_FRONT);
  668.  
  669.     lastGraph = GMGetGraph();    /* カレントグラフを退避する    */
  670.     /* ダイアログをカレントグラフにする */
  671.     GMSetGraph(&dialogPtr->window.graph);
  672.     GMAPage(G_ALLPAGE);
  673.     GMFontKind(G_ROM12);
  674.     GMFontFace(G_BOLD);
  675.     GMShadowStrZ("電脳倶楽部書類を表示します。", LONGWORD(30,72));
  676.     GMShadowStrZ("F.Ogasawara 1995",LONGWORD(60,100));
  677.     DMControl(NULL);
  678.     DMDispose(dialogPtr);        /* ダイアログを廃棄する        */
  679.     GMSetGraph(lastGraph);        /* カレントグラフを元に戻す    */
  680. }
  681.  
  682. /******************************************************************************
  683.  *    IdleEvent():    アイドルイベント処理
  684.  ******************************************************************************
  685.  *    引数:    ComVal *pcv    共通変数へのポインタ
  686.  */
  687. void IdleEvent(ComVal *pcv)
  688. {
  689.     Rect rc = {0, 0, WIN_H, WIN_V};
  690.  
  691.     if (pcv->scrollFlag) {
  692.         if (EMLBttn() || EMRBttn()) {    /* マウスのボタンが押されているか? */
  693.             /* イベントが自分のウィンドウか? */
  694.             if (pcv->event.ev.whom.win == pcv->windowPtr)
  695.                 scrollTxt(pcv, pcv->scrollDir);
  696.         } else {
  697.                 pcv->scrollFlag = FALSE; /* スクロールは終了した */
  698.         }
  699.     }
  700.     if (GMPtInRect(&rc, EMMSLoc())    /* マウスポインタ行番号表示    */
  701.         && (pcv->event.ev.whom.win == pcv->windowPtr)) {
  702.         setlnum(pcv);
  703.     }
  704.  
  705. }
  706.  
  707. /******************************************************************************
  708.  *    keyDownEvent():    キーダウンイベント処理
  709.  ******************************************************************************
  710.  *    引数:    ComVal *pcv    共通変数へのポインタ
  711.  *    注釈:    OPT.1+'Q'キーでの終了処理を行う。
  712.  */
  713. void keyDownEvent(ComVal *pcv)
  714. {
  715.     int shortCut;            /* ショートカットキー        */
  716.  
  717.     if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか?    */
  718.         /* キー入力した文字を大文字に変換する */
  719.         shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
  720.         if (shortCut == 'Q')    /* 終了か?            */
  721.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  722.     }
  723. }
  724.  
  725. /******************************************************************************
  726.  *    updateEvent():    アップデート処理
  727.  ******************************************************************************
  728.  *    引数:    ComVal *pcv    共通変数へのポインタ
  729.  *    注釈:
  730.  *    アップデート処理としてウィンドウ内部を描画する。
  731.  *    この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
  732.  *    イベントの処理ができなくなります。
  733.  */
  734. void updateEvent(ComVal *pcv)
  735. {
  736.     /* イベントが自分のウィンドウか? */
  737.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  738.         WMUpdate(pcv->windowPtr);    /* アップデートを開始する */
  739.         drawGraph(pcv ,0);        /* テキスト全体を書き替え */
  740.         WMUpdtOver(pcv->windowPtr);     /* アップデートを終了する */
  741.     }
  742. }
  743.  
  744. /******************************************************************************
  745.  *    drawGraph():    ウィンドウ内部の描画
  746.  ******************************************************************************
  747.  *    引数:    ComVal *pcv    共通変数へのポインタ
  748.  */
  749. void drawGraph(ComVal *pcv, int sel)
  750. {
  751.     Rect rc = {520, 363, 554, 379};
  752.  
  753.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  754.     drawtxt(pcv, sel);
  755.     CMValueSet(pcv->volHdl, pcv->ofset);
  756.     if (pcv->mloadFlag == 0) {    /* ZMSファイルロード済み?    */
  757.         CMShine(pcv->btn10Hdl, C_INACTIVE);
  758.         CMShine(pcv->btn11Hdl, C_INACTIVE);
  759.     }
  760.     if (pcv->mojiFlag == 0) {    /* 検索文字指定済み?        */
  761.         CMShine(pcv->btn92Hdl, C_INACTIVE);
  762.         CMShine(pcv->btn93Hdl, C_INACTIVE);
  763.     }
  764.     if (pcv->pastFno == 0)        /* 下層テキストロード済み?    */
  765.         CMShine(pcv->btn12Hdl, C_INACTIVE);
  766.     CMDraw(pcv->windowPtr);
  767.     if (pcv->loadFlag && pcv->lineDisp) { /* 行番号表示        */
  768.         GMShadowRect(&rc);
  769.         setlnum(pcv);
  770.     }
  771. }
  772.  
  773. /******************************************************************************
  774.  *    setlnum():    行番号表示
  775.  ******************************************************************************
  776.  *    引数:    ComVal *pcv    共通変数へのポインタ
  777.  */
  778. void setlnum(ComVal *pcv)
  779. {
  780.     int mpos;
  781.     int comline;
  782.     char buff[10];
  783.  
  784.     if (!pcv->lineDisp || pcv->loadFlag == 0)
  785.         return;
  786.  
  787.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  788.     mpos = (int)LOWWORD(EMMSLoc());
  789.     comline = pcv->ofset + (mpos / 12) + 1;
  790.     if (mpos > 380) {
  791.         strcpy(buff, "~BAR~");
  792.     } else if (mpos >360) {
  793.         strcpy(buff, "_BAR_");
  794.     } else {
  795.         sprintf(buff, "%5d", comline);
  796.     }
  797.     GMMove(LONGWORD(521,364));
  798.     GMDrawStrZ(buff);
  799. }
  800.  
  801. /******************************************************************************
  802.  *    activateEvent():    アクティベートイベント処理
  803.  ******************************************************************************
  804.  *    引数:    ComVal *pcv    共通変数へのポインタ
  805.  *    注釈:    アクティブ、インアクティブによるアクティブフラグの切り替えと、
  806.  *        イベントマスクの切り替えを行う。
  807.  */
  808. void activateEvent(ComVal *pcv)
  809. {
  810.     /* イベントが自分のウィンドウか? */
  811.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  812.         pcv->activeFlag = TRUE;    /* アクティブフラグをセットする    */
  813.         /* アクティブ時のイベントマスクをセットする */
  814.         pcv->eventMask = EVENTMASK | EM_KEYDOWN;
  815.     /* イベントが他のウィンドウで、自分がアクティブ状態か? */
  816.     } else if (pcv->activeFlag) {
  817.         pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
  818.         /* インアクティブ時のイベントマスクをセットする */
  819.         pcv->eventMask = EVENTMASK;
  820.     }
  821. }
  822.  
  823. /******************************************************************************
  824.  *    systemEvent():    システムイベント処理
  825.  ******************************************************************************
  826.  *    引数:    ComVal *pcv    共通変数へのポインタ
  827.  *    注釈:    全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
  828.  *        対応した処理を行う。
  829.  */
  830. void systemEvent(ComVal *pcv)
  831. {
  832.     switch (pcv->event.ts.what2) {    /* イベントの種類は?        */
  833.     case CLOSEALL:            /* 全ウィンドウのクローズ    */
  834.     case ENDTSK:            /* 全タスクの終了        */
  835.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  836.         break;
  837.     case WINDOWSELECT:        /* ウィンドウのセレクト        */
  838.         WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
  839.         break;
  840.     case DRAGEND:            /* ドラッグの終了        */
  841.         /* イベントが自分のウィンドウか? */
  842.         if (pcv->event.ev.whom.win == pcv->windowPtr) {
  843.             /* ラバーバンドを消去する */
  844.             TSHideDrag();
  845.             /* アイコンのドロップ処理を行う */
  846.             dropIcon(pcv);
  847.         }
  848.         break;
  849.     }
  850. }
  851.  
  852. /******************************************************************************
  853.  *    showErrDialog():    エラーダイアログの表示
  854.  ******************************************************************************
  855.  *    引数:    ComVal *pcv    共通変数へのポインタ
  856.  */
  857. void showErrDialog(ComVal *pcv)
  858. {
  859.     int i;
  860.  
  861.     static struct {            /* エラー情報        */
  862.         int code;        /* エラーコード        */
  863.         int manager;        /* 使用するマネージャ    */
  864.         int flag;        /* 表示フラッグ        */
  865.         char *message;        /* エラーメッセージ    */
  866.     } errInfo[] = {
  867.         { 1, 1, D_RED,    "SX SYSTEMのバージョンが違います。" },
  868.         { 2, 2, D_RED,    "ウィンドウが作成できません。" },
  869.         { 0, 1, D_YELLOW, "エラーが発生しました。" }
  870.     };
  871.  
  872.     for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す    */
  873.         if (errInfo[i].code == pcv->errorCode)
  874.             break;
  875.     switch (errInfo[i].manager) {    /* マネージャの選択        */
  876.     case 1:                /* ダイアログマン        */
  877.         DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  878.         break;
  879.     case 2:                /* タスクマン            */
  880.         TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  881.         break;
  882.     }
  883. }
  884.  
  885. /******************************************************************************
  886.  *    endProc():    終了手続き
  887.  ******************************************************************************
  888.  *    引数:    int code    終了コード
  889.  *        ComVal *pcv    共通変数へのポインタ
  890.  *    注釈:    ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
  891.  */
  892. void endProc(int code, ComVal *pcv)
  893. {
  894.     /* 環境設定の保存    */
  895.  
  896.     (int) **pcv->mzHdl  =  pcv->mzTask;
  897.     (int) **pcv->pcmHdl =  pcv->pcmTask;
  898.     (int) **pcv->picHdl =  pcv->picTask;
  899.  
  900.     **pcv->envHdl         =  pcv->scrollstep;
  901.     *((*pcv->envHdl) + 1)     =  pcv->cutDisp;
  902.     *((*pcv->envHdl) + 2)    =  pcv->lineDisp;
  903.  
  904.     strcpy((*pcv->mzHdl)  +  1,     pcv->mzFname);
  905.     strcpy((*pcv->mzHdl)  + 91,     pcv->mzOpt);
  906.     strcpy((*pcv->pcmHdl) +  1,     pcv->pcmFname);
  907.     strcpy((*pcv->pcmHdl) + 91,     pcv->pcmOpt);
  908.     strcpy((*pcv->picHdl) +  1,     pcv->picFname);
  909.     strcpy((*pcv->picHdl) + 91,     pcv->picOpt);
  910.  
  911.     TSResSave(pcv->lbFname);
  912.  
  913.     if (pcv->menuHdl != NULL)
  914.         MMHdlDispose(pcv->menuHdl); /* メニューハンドルを解放する */
  915.  
  916.     if (pcv->hResMap != NULL)
  917.         TSResRemove();        /* リソースマップハンドル */
  918.  
  919.     if (pcv->txt != NULL)
  920.         MMHdlDispose(pcv->txt);    /* テキスト領域のハンドル */
  921.  
  922.     if (pcv->txtNo != NULL)
  923.         MMHdlDispose(pcv->txtNo); /* 改行情報のハンドル */
  924.  
  925.     if (pcv->updateRgnHdl != NULL)
  926.         GMDisposeRgn(pcv->updateRgnHdl); /* アップデートリージョン
  927.                             ハンドルの解放      */
  928.  
  929.     if (pcv->txtRgnHdl != NULL)
  930.         GMDisposeRgn(pcv->txtRgnHdl); /* テキスト描画リージョン */
  931.  
  932.     if (pcv->winRgnHdl != NULL)
  933.         GMDisposeRgn(pcv->winRgnHdl); /* ウィンドウリージョン    */
  934.  
  935.     dispoBits(pcv);
  936.  
  937.     /* ウィンドウポインタが確保されたままか? */
  938.     if (pcv->windowPtr != NULL)
  939.         CMKill(pcv->windowPtr);    /* すべてのコントロールを廃棄する */
  940.         WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する    */
  941.  
  942.     exit(code);            /* プログラムを終了する        */
  943. }
  944. STR@uEdEV3.00<@(!%G0JHH     
  945. S((SBxヨH vケ > >Ohh$000ヨ=4